package com.clp.protocol.iec104.iec104.client.state;

import java.util.List;

/**
 * 主站状态信息，用来查看当前主站的一些状态
 */
public interface MasterStateInfo {

    int totalCall100PeriodSeconds();

    int totalCall101PeriodSeconds();

    int t0Seconds();

    int t1Seconds();

    int t2Seconds();

    int t3Seconds();

    /**
     * 是否已经激活了启动传输
     * @return
     */
    boolean isStartedDt();

    /**
     * 是否接收到了初始化结束
     * @return
     */
    boolean isRecvedInitEnd();

    /**
     * 是否在进行链路测试
     * @return
     */
    boolean isTestingFr();

    /**
     * 是否正在进行 总召唤100
     * @return
     */
    boolean isDoingTotalCall100();

    /**
     * 是否正在进行总召唤101
     * @return
     */
    boolean isDoingTotalCall101();

    List<Integer> listAllDoingTcAddrs();

    List<TcMasterState.PtState> listAllDoingTcPtStates();

    /**
     * 该测点是否在进行单点遥控选择
     * @param infoObjAddr 信息体地址
     * @return
     */
    boolean isDoingOnePointTcSelect(int infoObjAddr);

    /**
     * 该测点是否在进行双点遥控选择
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTwoPointTcSelect(int infoObjAddr);

    /**
     * 该测点是否在进行遥控选择
     * @param infoObjAddr
     * @return
     */
    default boolean isDoingTcSelect(int infoObjAddr) {
        return isDoingOnePointTcSelect(infoObjAddr) || isDoingTwoPointTcSelect(infoObjAddr);
    }

    default boolean isDoingOnePointTc(int infoObjAddr) {
        return isDoingOnePointTcSelect(infoObjAddr) || isDoingOnePointTcExecute(infoObjAddr);
    }

    /**
     * 该测点是否在进行单点遥控执行
     * @param infoObjAddr 信息体地址
     * @return
     */
    boolean isDoingOnePointTcExecute(int infoObjAddr);

    /**
     * 该测点是否在进行双点遥控执行
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTwoPointTcExecute(int infoObjAddr);

    /**
     * 该测点是否在进行遥控执行
     * @param infoObjAddr
     * @return
     */
    default boolean isDoingTcExecute(int infoObjAddr) {
        return isDoingOnePointTcSelect(infoObjAddr) || isDoingTwoPointTcSelect(infoObjAddr);
    }

    default boolean isDoingTwoPointTc(int infoObjAddr) {
        return isDoingTwoPointTcSelect(infoObjAddr) ||isDoingTwoPointTcExecute(infoObjAddr);
    }

    /**
     * 该测点是否在进行遥控
     * @param infoObjAddr
     * @return
     */
    default boolean isDoingTc(int infoObjAddr) {
        return isDoingTcSelect(infoObjAddr) || isDoingTcExecute(infoObjAddr);
    }

    List<TaMasterState.PtState> listAllDoingTaPtStates();

    /**
     * 该测点是否在进行遥调选择归一化值
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaSelectNormalized(int infoObjAddr);

    /**
     * 该测点是否在进行遥调选择标度化值
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaSelectScaled(int infoObjAddr);

    /**
     * 该测点是否在进行遥调选择短浮点数
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaSelectFloat(int infoObjAddr);

    /**
     * 该点是否在进行遥调选择
     * @param infoObjAddr
     * @return
     */
    default boolean isDoingTaSelect(int infoObjAddr) {
        return isDoingTaSelectNormalized(infoObjAddr) || isDoingTaSelectScaled(infoObjAddr) || isDoingTaSelectFloat(infoObjAddr);
    }

    /**
     * 是否正在执行遥调执行-归一化值
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaExecuteNormalized(int infoObjAddr);

    /**
     * 是否正在遥调执行-标度化值
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaExecuteScaled(int infoObjAddr);

    /**
     * 是否正在遥调执行-短浮点数
     * @param infoObjAddr
     * @return
     */
    boolean isDoingTaExecuteFloat(int infoObjAddr);

    /**
     * 是否正在遥调执行
     * @param infoObjAddr
     * @return
     */
    default boolean isDoingTaExecute(int infoObjAddr) {
        return isDoingTaExecuteNormalized(infoObjAddr) || isDoingTaExecuteScaled(infoObjAddr) || isDoingTaExecuteFloat(infoObjAddr);
    }

}
